import axios from "axios";
import { Toast } from "vant";
import store from "@/store";
import { login } from "@/api/login";
import router from "../router";
// import router from '@/router/index'
// 处理loading
const toast = () => {
  Toast.loading({
    duration: 0, // 持续展示 toast
    forbidClick: true,
    loadingType: "spinner",
    className: "loading-icon",
    message: "加载中..."
  });
};

const request = axios.create({
  // API 请求的默认前缀
  baseURL: process.env.VUE_APP_API_BASE_URL,
  timeout: 20000, // 请求超时时间
  withCredentials: false
});

// const instance = axios.create({
//   //   baseURL: process.env.VUE_APP_BASE_URL, // 如果不配置代理,就用这个
//   baseURL: '/itour', // 如果配置代理就用这个
//   timeout: 3500,
// })

// // 异常拦截处理器
const errorHandler = error => {
  if (error.response) {
    const data = error.response.data;
    // 从 localstorage 获取 token
    const token = localStorage.getItem("client_authorization");
    if (error.response.status === 403) {
      Toast.fail({
        // title: 'Forbidden',
        message: data.message
      });
    }
    if (error.response.status === 500) {
      Toast.fail({
        // title: '服务器异常',
        message: data.message
      });
    }
    if (error.response.status === 502) {
      return Toast.fail({
        message: "后端正在发布,请稍后再试"
      });
    }
    if (error.response.status === 401) {
      Toast.fail({
        message: "登录失效,请重新登录"
      });

      if (token) {
        // store.dispatch('Logout').then(() => {
        //   setTimeout(() => {
        //     window.location.reload()
        //   }, 1500)
        // })
      }
    }
  }
  return Promise.reject(error);
};

// // 创建请求拦截
// instance.interceptors.request.use(
//   (config) => {
//     toast()
//     // 每次请求的时候 都拿到一个取消请求的方法
//     const Cancel = axios.CancelToken // 产生一个请求令牌
//     config.headers['token'] = 'token'
//     config.cancelToken = new Cancel((c) => store.commit('ajax/push', c))
//     return config
//   },
//   (error) => {
//     Toast.clear()
//     Promise.reject(error)
//   },
// )

request.interceptors.request.use(config => {
  const token = localStorage.getItem("client_authorization");
  // 如果 token 存在
  // 让每个请求携带自定义 token 请根据实际情况自行修改
  if (token) {
    config.headers["Authorization"] = "Bearer " + token;
  }
  if (config._hasLoading) {
    toast();
  }
  // 每次请求的时候 都拿到一个取消请求的方法
  const Cancel = axios.CancelToken; // 产生一个请求令牌
  config.headers["token"] = "token";
  config.cancelToken = new Cancel(c => store.commit("ajax/push", c));

  return config;
}, errorHandler);

request.interceptors.response.use(response => {
  if (response.data.code == 401) {
    sessionStorage.removeItem("client_authorization");
    store
      .dispatch("login")
      .then(() => {
        router.go(0);
      })
      .catch(err => {});
  } else {
    Toast.clear();
    return response.data;
  }
}, errorHandler);
export default request;
